package com.login_php.manager;

import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.google.common.base.Strings;
import com.login_php.domain.commons.Usuario;
import com.login_php.domain.user.Credential;
import com.login_php.domain.user.UsuarioUpdate;
import com.login_php.manager.exception.EncriptException;
import com.login_php.manager.exception.PasswordDosentMatchException;
import com.login_php.manager.exception.UserAreadyExistsException;
import com.login_php.manager.exception.UserDontExistsException;
import com.login_php.services.UsuarioService;

public class UsuarioEng {

	private static UsuarioService USUARIO_SERVICE;
	private static final Logger LOG = Logger.getLogger(UsuarioEng.class);
	private Usuario usuarioLogado;
	private boolean isUsuarioLogado = false;
	
	static {
		USUARIO_SERVICE = new UsuarioService();
	}
	
	public Usuario registerUsuario(Usuario usuario) throws EncriptException, UserAreadyExistsException{		
		
		if(USUARIO_SERVICE.isUserExiste(usuario.getUsuario())){
			throw new UserAreadyExistsException();
		}
		
		usuario.setDataCadastro(new Date());
		
		try{
			usuario.setSenha(SecurityEng.encrypt(usuario.getSenha()));
		}catch(Exception e){
			LOG.error(e);
			throw new EncriptException();
		}
		
		USUARIO_SERVICE.salvarUsuario(usuario);
		
		return usuario;
	}
	
	public List<Usuario> getAllUsuarios(){
		return USUARIO_SERVICE.searchUsuario(null, false);
	}
	
	public void deleteUsuarioByUsuario(Usuario usuario){
		if(usuario != null){
			deleteUsuarioById(usuario.getId());
		}
	}
	
	public void deleteUsuarioById(int id){
		Usuario prod = new Usuario();
		prod.setId(id);
		USUARIO_SERVICE.removeUsuario(prod);
	}
	
	public Usuario getUsuarioById(int id){
		return USUARIO_SERVICE.searchUsuarioById(id);
	}
	
	public void updateUsuarioByUsuario(UsuarioUpdate usuario) throws UserAreadyExistsException, EncriptException{
		
		if(usuario.isUserChange() && USUARIO_SERVICE.isUserExiste(usuario.getUsuario())){
			throw new UserAreadyExistsException();
		}
		
		if(usuario.isPasswordChange()){
			try{
				usuario.setSenha(SecurityEng.encrypt(usuario.getSenha()));
			}catch(Exception e){
				LOG.error(e);
				throw new EncriptException();
			}
		}
		
		USUARIO_SERVICE.updateUsuario(usuario);
	}
	
	public Usuario login(Credential credential) throws UserDontExistsException, PasswordDosentMatchException{
		
		Usuario user = USUARIO_SERVICE.searchUsuarioByUser(credential.getUser());
		
		if(user == null){throw new UserDontExistsException();}
		
		if(StringUtils.isEmpty(credential.getSenha())){
			throw new PasswordDosentMatchException();
		}
		
		String encripted = "";
		
		try {
			encripted = SecurityEng.encrypt(credential.getSenha());
		} catch (Exception e) {
			LOG.error("Ocorreu um erro ao criptografar a senha", e);
			
			throw new PasswordDosentMatchException();
		}
		
		if(!(user.getSenha().compareTo(encripted) == 0)){
			throw new PasswordDosentMatchException();
		}
		
		usuarioLogado = user;
		isUsuarioLogado = true;
		
		return user;
		
		
	}
	
	public void logoff(){
		usuarioLogado = null;
		isUsuarioLogado = false;
	}
	
	public Usuario getUSuarioLogado(){
		return usuarioLogado;
	}
	
	public boolean isUsuarioLogado(){
		return isUsuarioLogado;
	}
}